package com.hb.trade.server.center.au.service;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hb.core.pojo.center.au.entity.RoleResource;
import com.hb.core.pojo.center.sys.dto.MenuResourceDTO;
import com.hb.core.pojo.enums.RoleSignEnum;
import com.hb.core.pojo.enums.RoleTypeEnum;
import org.fzzn.core.util.Enums;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 角色权限中间表 服务类
 *
 * @author zhaojk
 * @since 2021-11-29
 */
public interface RoleResourceService extends IService<RoleResource> {

    /**
     * 更新角色权限
     *
     * @param roleId        角色ID
     * @param menuResources 系统菜单集合
     * @return
     */
    boolean updatePermissions(Long roleId, List<MenuResourceDTO> menuResources);

    /**
     * 更新角色权限
     *
     * @param roleId      角色ID
     * @param resourceIds 系统菜单ID集合
     * @return
     */
    boolean updatePermissionsWithMenuIds(Long roleId, List<Long> resourceIds);

    /**
     * 删除角色菜单表中的关联数据
     *
     * @param roleId
     * @return
     */
    boolean cleanRolePermissions(Long roleId);

    /**
     * 赋予角色指定的权限
     *
     * @param roleId       要赋予权限的角色ID
     * @param roleSign     业务角色标识
     * @param roleTypeEnum 角色类型
     * @return
     */
    default boolean updatePermissionsDefault(Long roleId, int roleSign, RoleTypeEnum roleTypeEnum) {
        RoleSignEnum roleSignEnum = Enums.of(RoleSignEnum.class, roleSign);
        if (roleSignEnum == null) {
            return false;
        }
        if (roleTypeEnum == null) {
            return false;
        }
        List<Long> resIds = CollUtil.list(false);
        switch (roleSignEnum) {
            // 代理机构
            case AGENCY:
            // 招标人
            case TENDEREE:
                switch (roleTypeEnum) {
                    // 分公司管理员
                    case BRANCH_COMPANY_MANAGER:
                        // 企业管理
                        resIds.add(1485814964645171200L);
                        // 企业基本信息
                        resIds.add(1485815282594385920L);
                        // 收款方式管理
                        resIds.add(1485815712476991488L);
                        // 组织架构管理
                        resIds.add(1485815576376020992L);
                        // 角色管理
                        resIds.add(1515153185708544000L);

                    // 部门负责人
                    case DEPT_MANAGER:
                    // 项目经理
                    case PROJECT_MANAGER:
                        // 建设工程项目
                        resIds.add(1467771227518656512L);
                        // 公开招标
                        resIds.add(1467771227518656513L);
                        // 邀请招标
                        resIds.add(1467771227518656514L);

                        // 政府采购项目
                        resIds.add(1467771227518656515L);
                        // 公开招标
                        resIds.add(1467771227518656516L);
                        // 邀请招标
                        resIds.add(1467771227518656517L);
                        // 竞争性谈判
                        resIds.add(1467771227518656518L);
                        // 竞争性磋商
                        resIds.add(1467771227522850816L);
                        // 单一来源采购
                        resIds.add(1467771227522850817L);
                        // 询价
                        resIds.add(1467771227522850818L);

                        // 企业管理
                        resIds.add(1485814964645171200L);
                        // 企业基本信息
                        resIds.add(1485815282594385920L);
                        // 企业专属定制
                        resIds.add(1514451815095373824L);

                        // 资料库
                        resIds.add(1485846516073361408L);
                        // 供应商库
                        resIds.add(1485847133030313984L);
                        // 专家库
                        resIds.add(1493106426510585856L);

                        // 投诉异议
                        resIds.add(1491665713841655808L);
                        // 企业基本信息（全局）
                        // updatePermissionsWithMenuIds方法会把 active_menu为0的加上，所以这里删除
                        // resIds.add(1523966963159781376L);
                        // 消息中心
                        resIds.add(1494570850385596416L);
                        // 消息中心（全局）
                        // updatePermissionsWithMenuIds方法会把 active_menu为0的加上，所以这里删除
                        // resIds.add(1522464979780009984L);

                        break;
                    default:
                        break;
                }
                break;
            // 投标人
            case BIDDER:
                switch (roleTypeEnum) {
                    case BRANCH_COMPANY_MANAGER:
                        // 企业管理
                        resIds.add(1485814964645171200L);
                        // 企业基本信息
                        resIds.add(1485815282594385920L);
                        // 组织架构管理
                        resIds.add(1485815576376020992L);
                        // 角色管理
                        resIds.add(1515153185708544000L);
                    case DEPT_MANAGER:
                    case PROJECT_MANAGER:
                        // 项目大厅
                        resIds.add(1472816020275175424L);
                        // 报名结果
                        resIds.add(1472857147380387840L);
                        // 我的项目
                        resIds.add(1473531020495179776L);
                        // 企业资料库
                        resIds.add(1485807651874795520L);
                        // 投诉异议
                        resIds.add(1491665713841655808L);
                        // 消息中心
                        resIds.add(1494570850385596416L);
                        //updatePermissionsWithMenuIds方法会把 active_menu为0的加上，所以这里删除
                        //resIds.add(1522464979780009984L);
                        // 邀请回执
                        resIds.add(1495629662681645056L);
                        // 填写报名信息
                        resIds.add(1472835008101097472L);
                        // 企业基本信息
                        // updatePermissionsWithMenuIds方法会把 active_menu为0的加上，所以这里删除
                        //resIds.add(1523966963159781376L);
                    default:
                        break;
                }
        }
        if (CollUtil.isEmpty(resIds)) {
            return false;
        }

        // id去重
        List<Long> newList = resIds.stream().distinct().collect(Collectors.toList());

        return updatePermissionsWithMenuIds(roleId, newList);
    }
}
